import Immutable from 'immutable';

const paginationUtil = {
    /**
     * 得到要展示的页码数组,从0开始的哦.
     *
     * 算法：
     * １.总长度小于，等于要显示的长度，那么全部展示
     * ２.总长度大于要显示的长度，但要显示的开头或结尾会显示．
     *
     * ３.总长充大于要显示的升序，开头结尾不显示．
     *
     * @param displayLength 要展示数量
     * @param totalPageNo   总页数
     * @param currentPageNo 当前页码
     * @returns {*}
     */
    getDisplayPageArray (displayLength, totalPageNo, currentPageNo) {

        if (totalPageNo == 0) {//如果总页数为0
            return [];
        }

        if (totalPageNo <= displayLength) {
            return Immutable.Range(0, totalPageNo).toJS();
        } else {
            let middleDisplay = Math.floor(displayLength / 2);//中间值  7
            let after = displayLength - middleDisplay;//-2
            //console.log(' 两边显示均分为:'+middleDisplay+"   后after="+after);

            //判断是有头或有尾的，第二种情况
            let beginIndex = currentPageNo - middleDisplay;
            let endIndex = currentPageNo + after;
            //console.log(beginIndex,'----');
            if (beginIndex <= 0) {//开头的这种
                return Immutable.Range(0, displayLength).toJS();
            } else if (endIndex > (totalPageNo - 1)) {//结尾的这种
                return Immutable.Range(totalPageNo - displayLength, totalPageNo).toJS();
            } else {//中间的这种
                return Immutable.Range(beginIndex, endIndex).toJS();
            }
        }
    },

    /**
     * 分页组件左侧、中间、右侧都可以计算出的页码数组
     * @param leftLength    左侧显示几页
     * @param rightLength    右侧显示几页
     * @param centerLength    中间显示几页
     * @param totalPageNo    总页数
     * @param currentPageNo    当前页
     * @author of2198 2016/5/3
     */
    getAdvancedPageArray (leftLength, rightLength, centerLength,
                          totalPageNo, currentPageNo) {
        let result = Immutable.List();
        if (totalPageNo == 0) {
            return [];
        }
        if (centerLength < 1) {
            centerLength = 1;
        }
        let displayLength = leftLength + rightLength + centerLength;
        //当总页数小于等于要显示的页数时
        if (totalPageNo <= displayLength) {
            return Immutable.Range(0, totalPageNo).toJS();
        } else {
            //根据中间要显示的页数，算出最前和最后的页数
            let middleDisplay = Math.floor(centerLength / 2);
            let after = centerLength - middleDisplay;
            let beginIndex = currentPageNo - middleDisplay;
            let endIndex = currentPageNo + after;
            if (endIndex < centerLength) {
                endIndex = centerLength;
            }

            var elliLength = leftLength + 1 + middleDisplay; //左侧出现省略号的长度
            //当前页大于或等于出现省略号长度的时候，计算省略号出现的位置
            if (currentPageNo >= elliLength) {
                if (beginIndex <= 0) {//开始页小于等于0时
                    result = Immutable.Range(0, centerLength);
                } else if (endIndex > (totalPageNo - 1)) {//结束页大于总页数减1时
                    if (leftLength > 0) {
                        Immutable.Range(0, leftLength).forEach(left => {
                            result = result.push(left);
                        });

                        result = result.push("...");
                    }

                    Immutable.Range(totalPageNo - centerLength, totalPageNo).forEach(a => {
                        result = result.push(a);
                    })
                } else {//正常处理流程
                    if (leftLength > 0) {//当左侧长度大于0时，左侧才会显示页数
                        Immutable.Range(0, leftLength).forEach(left => {//左侧显示页数
                            result = result.push(left);
                        });

                        result = result.push("..."); //出现省略号位置
                    }

                    Immutable.Range(beginIndex, endIndex).forEach(b => {//中间页数的显示
                        result = result.push(b);
                    });

                    //如果右侧显示长度大于零则计算右侧省略号出现的位置
                    if (rightLength > 0) {
                        if (endIndex + rightLength >= totalPageNo) {
                            Immutable.Range(endIndex, totalPageNo).forEach(c => {
                                result = result.push(c);
                            })
                        } else {
                            result = result.push('...');
                            Immutable.Range(totalPageNo - rightLength, totalPageNo).forEach(d => {
                                result = result.push(d);
                            })
                        }
                    }
                }

            } else {
                Immutable.Range(0, endIndex).forEach(e => {
                    result = result.push(e);
                });

                if (rightLength > 0) {
                    if (endIndex + rightLength >= totalPageNo) {
                        Immutable.Range(endIndex, totalPageNo).forEach(c => {
                            result = result.push(c);
                        })
                    } else {
                        result = result.push('...');
                        Immutable.Range(totalPageNo - rightLength, totalPageNo).forEach(d => {
                            result = result.push(d);
                        })
                    }
                }
            }

            return result.toJS();
        }

    }
};

export default paginationUtil;
